<p>根据规约, 这个方法 <code>Object.wait(...)</code>, <code>Object.notify()</code> and <code>Object.notifyAll()</code> 应该由作为对象监视器的所有者的线程调用。
  如果不是这种情况，则会抛出<code> IllegalMonitorStateException </code> 异常。该规则通过强制仅在<code> synchronized </code> 方法或语句内调用这些方法之一来加强此约束。</p>

<h2>不规范代码样例</h2>
<pre>
private void removeElement() {
  while (!suitableCondition()){
    obj.wait();
  }
  ... // 执行移除
}
</pre>

or

<pre>
private void removeElement() {
  while (!suitableCondition()){
    wait();
  }
  ... // 执行移除
}
</pre>

<h2>正确的代码样例</h2>
<pre>
private void removeElement() {
  synchronized(obj) {
    while (!suitableCondition()){
      obj.wait();
    }
    ... // 执行移除
  }
}
</pre>

or

<pre>
private synchronized void removeElement() {
  while (!suitableCondition()){
    wait();
  }
  ... // 执行移除
}
</pre>